%     FASTENER DOCTOR - программа для лечения и конвертации крепежа
%     Copyright (C) 2018  Михаил Козлов
%     Сайт проекта: <http://www.fastenerdoctor.ru/>
%     Адрес электронной почты для связи с разработчиком:
%     <doctor.fastener@gmail.com>
% 
%     Эта программа является свободным программным обеспечением: Вы можете
%     распространять ее и/или изменять, соблюдая условия Универсальной общественной
%     лицензии GNU, опубликованной Фондом свободного программного обеспечения,
%     либо редакции 3, либо (на Ваше усмотрение) любой редакции, выпущенной позже.
% 
%     Эта программа распространяется в надежде на то, что она окажется полезной,
%     но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, включая даже подразумеваемую гарантию ТОВАРНОЙ ПРИГОДНОСТИ,
%     либо ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Ознакомьтесь с Универсальной общественной
%     лицензией GNU для получения более подробной информации.
% 
%     Вы должны были получить копию Универсальной общественной лицензии GNU
%     вместе с этой программой. Если Вы ее не получили, то перейдите по адресу:
%     <http://www.gnu.org/licenses/>.
% 
%     This program is free software: you can redistribute it and/or modify
%     it under the terms of the GNU General Public License as published by
%     the Free Software Foundation, either version 3 of the License, or
%     (at your option) any later version.
% 
%     This program is distributed in the hope that it will be useful,
%     but WITHOUT ANY WARRANTY; without even the implied warranty of
%     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
%     GNU General Public License for more details.
% 
%     You should have received a copy of the GNU General Public License
%     along with this program.  If not, see <https://www.gnu.org/licenses/>.

function Init_Tolerances (Model_length_unit)

% ############################################################################################################
% ##                                                                                                        ##
% ##   ВНИМАНИЕ! ИЗМЕНЕНИЕ СТАНДАРТНЫХ ЗНАЧЕНИЙ ДОПУСКОВ МОЖЕТ ПРИВЕСТИ К НЕПРАВИЛЬНОЙ РАБОТЕ ПРОГРАММЫ!    ##
% ##                                                                                                        ##
% ############################################################################################################

global ErrCode;

global MAT2_orthotropic_tolerance_multiplier; %   1
global MAT9_orthotropic_tolerance_multiplier; %   1
global MAT2_C_zero_det_tolerance; %               1
global MAT9_C_zero_det_tolerance; %               1
global Laminate_offset_round_tolerance; %         1
global Orientation_Vector_zero_tolerance; %       1
global Global_equivalence_tolerance; %            1
global Field_Zero_Record_Tolerance; %             1
global Field_Nonzero_Record_Tolerance; %          1

global K_Relative_Tolerance; %                    2
global I12_Tolerance; %                           2
global I1_I2_Relative_Tolerance; %                2
global J_I1_I2_Relative_Tolerance; %              2
global RA_RI_Relative_Tolerance; %                2
global Bolt_shank_deg_tolerance; %                2
global Plate_normal_deg_tolerance; %              2
global Plate_mat_ori_deg_tolerance; %             2
global Bolt_plate_deg_tolerance; %                2
global Offset_relative_tolerance; %               2
global Equidistant_hole_tolerance; %              2

global Cylindrical_CID_R_Tolerance; %             3
global CID_Vector_zero_tolerance; %               3
global Ref_Dir_Vector_zero_tolerance; %           3
global Coord_Origin_Bolt_Dist_tolerance %         3
global Coord_Z_Bolt_Axis_deg_tolerance; %         3
global Coord_Z_Mapping_deg_tolerance; %           3
global Bush_K_Zero_Tolerance; %                   3
global Bush_K_Relative_Tolerance; %               3
global Bush_Coord_Dir_deg_tolerance; %            3
global Plate_RBE2_Seq_Center_tolerance; %         3
global Load_RBE3_minimum_indep_nodes; %           3

% Безразмерные (относительные) допуски, используемые для проверки ортотропии материалов

MAT2_orthotropic_tolerance_multiplier = 2e-6; % Относительный допуск на сумму абсолютных значений элементов матрицы Гука материала MAT2, нарушающих ортотропию
MAT9_orthotropic_tolerance_multiplier = 1e-5; % Относительный допуск на сумму абсолютных значений элементов матрицы Гука материала MAT9, нарушающих ортотропию

% Допуски на неточное хранение величин в bdf файле (используются при отборе балок круглого сечения)

I12_Tolerance = 0.001; % Допуск при сравнении момента инерции балки I12 с нулем (отбор балок круглого сечения)
K_Relative_Tolerance = 0.001; % Относительный допуск при сравнении параметров сечения балки K1 и K2 со значением 0.9 (отбор балок круглого сечения)
I1_I2_Relative_Tolerance = 0.001; % Относительный допуск при сравнении моментов инерции I1 и I2 в балках круглого сечения
J_I1_I2_Relative_Tolerance = 0.001; % Относительный допуск на выполнение соотношения для моментов инерции J = I1 + I2 в балках круглого сечения
RA_RI_Relative_Tolerance = 0.001; % Относительный допуск при сравнении радиуса балки круглого сечения, полученного из площади сечения, и радиуса, полученного из момента инерции I1

% Угловые допуски, используемые при распознавании крепежа

Bolt_shank_deg_tolerance = 1; % [градусы] Максимальное допускаемое угловое отклонение в непрямолинейном стержне болта (иначе болт не распознается)
Plate_normal_deg_tolerance = 15; % [градусы] Максимальное допускаемое угловое отклонение между нормалями присоединенных к болту shell элементов в рамках одной пластины (иначе болт не распознается)
Plate_mat_ori_deg_tolerance = 15; % [градусы] Максимальное допускаемое угловое отклонение между векторами ориентации материала у присоединенных к болту shell элементов в рамках одной пластины (иначе болт не распознается)
Bolt_plate_deg_tolerance = 20; % [градусы] Максимальное допускаемое угловое отклонение нормалей присоединенных элементов от стержня болта (иначе болт не распознается)

% Относительные допуски, используемые при распознавании крепежа

Equidistant_hole_tolerance = 0.15; % Допуск, используемый при проверке равноудаленности узлов отверстия от стержня болта
Offset_relative_tolerance = 0.001; % Относительный допуск при сравнении офсетов присоединенных элементов с офсетом первого элемента (используется при проверке присоединенной топологии)

% Допуски, связанные с погрешностями вычислений

MAT2_C_zero_det_tolerance = 1e-6; % Допуск на равенство нулю определителя матрицы Гука материала MAT2.
MAT9_C_zero_det_tolerance = 1e-6; % Допуск на равенство нулю определителя матрицы Гука материала MAT9.
Laminate_offset_round_tolerance = 1e-14; % Допуск на ошибку округления в случае вычисления офсета ламината
Cylindrical_CID_R_Tolerance = 1e-14; % Допуск на равенство нулю координаты R в цилиндрической системе координат

% Допуски, используемые при создании полей величин

Field_Zero_Record_Tolerance = 1e-10; % Используется при сравнении величины с нулем
Field_Nonzero_Record_Tolerance = 0.0001; % Относительный допуск, используемый при сравнении ненулевых величин

% Допуски, используемые при починке крепежа

Bush_K_Zero_Tolerance = 0.00001; % Допуск при сравнении жесткостей BUSH-элементов с нулем
Bush_K_Relative_Tolerance = 0.005; % Относительный допуск при сравнении жесткостей BUSH-элементов

% Угловые допуски, используемые при починке крепежа

Coord_Z_Bolt_Axis_deg_tolerance = 1; % [градусы] Максимальное допускаемое угловое отклонение оси Z общей СК болта Рутмана от стержня болта
Coord_Z_Mapping_deg_tolerance = 10; % [градусы] Максимальное допускаемое угловое отклонение при мэппинге направлений систем координат
Bush_Coord_Dir_deg_tolerance = 1; % [градусы] Максимальное допускаемое угловое отклонение осей СК ориентации BUSH-элемента от заданных направлений

% Допуски на количество объектов

Load_RBE3_minimum_indep_nodes = 9; % Минимальное число независимых узлов RBE3, служащих для раздачи нагрузки в модели

% Допуски, имеющие единицу измерения длины

Orientation_Vector_zero_tolerance = 0.005; % [мм] Минимальная допускаемая длина вектора ориентации балочного элемента
CID_Vector_zero_tolerance = 0.005; % [мм] Минимальная допускаемая длина базисного вектора системы координат
Global_equivalence_tolerance = 0.005; % [мм] Допуск на равенство координат двух узлов / допуск на длину
Ref_Dir_Vector_zero_tolerance = 0.005; % [мм] Минимальная допускаемая длина вектора отсчетного направления яруса болта Рутмана
Coord_Origin_Bolt_Dist_tolerance = 0.1; % [мм] Максимальное допускаемое расстояние от начала общей СК болта Рутмана до стержня болта
Plate_RBE2_Seq_Center_tolerance = 0.1; % [мм] Максимальное расстояние, на котором один из зависимых узлов RBE2 может располагаться от независимого узла, чтобы присоединенная топология plate_rbe2_sequential считалась центрованной

% Пересчет допусков, имеющих единицу измерения длины

if (~strcmp(Model_length_unit, 'mm'))

    switch Model_length_unit

        case 'm'

            k = 1000;

        case 'inch'

            k = 25.4;

        case 'ft'

            k = 304.8;

        otherwise

            fprintf (1, 'Init_Tolerances: недопустимое значение переменной Model_length_unit [%s] !\n', Model_length_unit);
            ErrCode = -1;
            return;

    end
    
    Orientation_Vector_zero_tolerance = Orientation_Vector_zero_tolerance / k;
    Global_equivalence_tolerance = Global_equivalence_tolerance / k;
    CID_Vector_zero_tolerance = CID_Vector_zero_tolerance / k;
    Ref_Dir_Vector_zero_tolerance = Ref_Dir_Vector_zero_tolerance / k;
    Coord_Origin_Bolt_Dist_tolerance = Coord_Origin_Bolt_Dist_tolerance / k;
    Plate_RBE2_Seq_Center_tolerance = Plate_RBE2_Seq_Center_tolerance / k;

end
